;; Here is some code to initialise the firmware and load a file
;; it is very useful to use this in a multiload game to load the
;; levels (after you have cracked it and saved them out).
;;
;; I do not authorise cracking software and piracy.
;;
;; NOTE:
;;
;; 1. Routine cannot be in &0000-&3fff (lower rom initialised into this
;; area)
;; 2. You cannot load a file into a area used by firmware (0000-&0040)
;; or &a600-&c000. If the program requires this, then load it to
;; somewhere else and LDIR/LDDR it to it's place.
;; 3. This code will initialise the firmware for it's loading, so you
;; must copy the data areas used by the firmware, load the file,
;; and copy them back, (or the game will crash).
;; Use the screen memory or the 2nd bank of 64k.
;; 4. Put this code where the loader for the levels is in the original game
;; 5. Dont forget to modify this code appropiatly. This is just an example.
.routine_address equ &a600
org routine_address
nolist
write"loader"
let mode=0 ;screen mode
.load_address equ &0040 ;address to put file
.km_initialise equ &bb00
.txt_output equ &bb5a
.cas_in_open equ &bc77
.cas_in_direct equ &bc83
.cas_in_close equ &bc7a
.cas_in_abandon equ &bc7d
.kl_init_back equ &bcce
.kl_l_rom_disable equ &b909
;; ** STORE DATA USED BY PROGRAM THAT WILL BE CORRUPTED BY INITIALISATION OF **
;; ** FIRMWARE **
di
ld (stack+1),sp ;save stack used by program
ld sp,&c000 ;new stack used by firmware and load routines
;; ** SAVE DATA OVERWRITTEN BY FIRMWARE **
;; !!EXAMPLE!!
ld hl,&a800
ld de,&c000 ;upper firmware area (&a800?-&c000)
ld a,4
.next push af
push de
ld bc,&600
ldir
pop de
ld a,d
add a,8
ld d,a
pop af
dec a
jr nz,next
ld h,&00 ;firmware lower jumpblock (&0000-&0040)
ld l,0
ld c,&40
ldir
;; ** INITIALISE ALTERNATE REGISTER SET FOR FIRMWARE **
exx
ld bc,&7f00+%10001000+mode ;initialise lower rom and select mode
out (c),c ;this routine must be located above &4000
exx
ex af,af'
xor a
ex af,af'
;; ** INITIALISE FIRMWARE **
call &0044 ;initialise lower jumpblock (&0000-&0040)
;and high kernal jumpblock (&b800-&bae4)
call &08bd ;initialise firmware jumpblock entries
;(&bb00- ...)
call km_initialise ;initialise keyboard manager
call kl_l_rom_disable ;disable lower rom
;; ** INITIALISE DISK ROM FOR LOADING/SAVING **
ld c,7 ;disk rom
ld de,&0040 ;lowest useable byte of memory
ld hl,&b0ff ;highest useable byte of memory
call kl_init_back ;initialise disk rom
xor a ;select drive (A)
ld (&ac00),a
ld a,&ff
ld (&be78),a ;turn of disc error messages
ld a,&c9
ld (txt_output),a ;prevent printing of text characters
;don't get error messages corrupting screen
;; ** LOAD FILE USING FIRMWARE **
ld b,end_filename-filename ;length of filename
ld hl,filename ;address of filename in memory
ld de,load_address ;address to put file/2k buffer to use (unused since
;read direct used
push de
call cas_in_open ;open file
pop hl ;HL = load address, BC = length of file
call cas_in_direct ;read it
call cas_in_close ;close it
;; ** RESTORE DATA WHICH WOULD HAVE BEEN OVERWRITTEN BY FIRMWARE **
;; !!EXAMPLE!!
di
ld hl,&c000 ;copy back data
ld de,&a800
ld a,4
.next2 push af
push hl
ld bc,&0600
ldir
pop hl
ld a,h
add a,8
ld h,a
pop af
dec a
jr nz,next2
ld d,&00 ;copy back &0000-&0040
ld e,0
ld c,&40
ldir
.stack ld sp,0 ;old stack back and...
ret ;...exit to program!!
.filename
defb "loadfile.dat"